from abc import ABC, abstractmethod
from enum import Enum, auto
from typing import List, Dict, Any, Optional, Callable, Union
from datetime import datetime

class ExchangeType(Enum):
    """交易所类型枚举"""
    GATE = auto()
    BINANCE = auto()
    HUOBI = auto()
    OKEX = auto()
    # 可以添加更多交易所

class KLineInterval(Enum):
    """K线时间间隔枚举"""
    MINUTE_1 = '1m'
    MINUTE_5 = '5m'
    MINUTE_15 = '15m'
    MINUTE_30 = '30m'
    HOUR_1 = '1h'
    HOUR_4 = '4h'
    HOUR_6 = '6h'
    HOUR_12 = '12h'
    DAY_1 = '1d'
    WEEK_1 = '1w'
    MONTH_1 = '1M'

class IExchange(ABC):
    """
    交易所接口抽象类
    所有交易所适配器必须实现此接口
    """
    
    @abstractmethod
    def get_name(self) -> str:
        """获取交易所名称"""
        pass
    
    @abstractmethod
    def get_exchange_type(self) -> ExchangeType:
        """获取交易所类型"""
        pass
    
    @abstractmethod
    async def get_klines(
        self, 
        symbol: str, 
        interval: KLineInterval, 
        start_time: Optional[datetime] = None, 
        end_time: Optional[datetime] = None,
        limit: Optional[int] = None
    ) -> List[Dict[str, Any]]:
        """
        获取K线数据
        
        参数:
            symbol: 交易对符号
            interval: K线时间间隔
            start_time: 开始时间（可选）
            end_time: 结束时间（可选）
            limit: 返回的K线数量限制（可选）
            
        返回:
            K线数据列表，每个K线是一个字典，包含以下字段:
            - datetime: 北京时间 (datetime)
            - datetime_utc: UTC时间 (datetime)
            - open: 开盘价 (float)
            - high: 最高价 (float)
            - low: 最低价 (float)
            - close: 收盘价 (float)
            - volume: 成交量 (float)
            - amount: 成交额 (float)
        """
        pass
    
    @abstractmethod
    async def get_symbols(self) -> List[str]:
        """
        获取所有可用的交易对符号
        
        返回:
            交易对符号列表
        """
        pass
    
    @abstractmethod
    async def get_ticker(self, symbol: str) -> Dict[str, Any]:
        """
        获取交易对的最新行情
        
        参数:
            symbol: 交易对符号
            
        返回:
            包含最新行情的字典
        """
        pass
    
    @abstractmethod
    async def create_order(self, 
                          symbol: str, 
                          size: int, 
                          price: str, 
                          side: str = "buy", 
                          order_type: str = "limit", 
                          **kwargs) -> Dict[str, Any]:
        """
        创建订单
        
        参数:
            symbol: 交易对符号
            size: 订单数量，正数为买入，负数为卖出
            price: 订单价格
            side: 订单方向，buy或sell
            order_type: 订单类型，limit(限价单)或market(市价单)
            **kwargs: 其他参数，根据交易所不同而不同
            
        返回:
            订单信息字典
        """
        pass

    
    @abstractmethod
    async def close(self):
        """关闭连接和资源"""
        pass
    
    def subscribe_ticker(self, symbol: str, callback: Callable[[List[Dict[str, Any]]], None]) -> bool:
        """
        订阅交易对的ticker数据
        
        参数:
            symbol: 交易对符号
            callback: 回调函数，接收ticker数据列表
            
        返回:
            订阅是否成功
        """
        raise NotImplementedError("该交易所未实现WebSocket ticker订阅功能")
    
    def subscribe_kline(self, symbol: str, interval: Union[KLineInterval, str], callback: Callable[[List[Dict[str, Any]]], None]) -> bool:
        """
        订阅交易对的K线数据
        
        参数:
            symbol: 交易对符号
            interval: K线时间间隔
            callback: 回调函数，接收K线数据列表
            
        返回:
            订阅是否成功
        """
        raise NotImplementedError("该交易所未实现WebSocket K线订阅功能")
    
    def close_all_ws_connections(self):
        """关闭所有WebSocket连接"""
        pass 